﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NAudio;
using NAudio.Wave;

namespace HPKaraoke
{
    // Lớp bài hát, chứa nội dung thông tin và chịu trách nhiệm thực hiện một số chức năng như Play, Pause...
    public class SongController
    {
        /// <summary>
        /// Bài hát đã được play hay chưa
        /// </summary>
        public bool WasPlayed { get; set; }

        /// <summary>
        /// Lời bài hát (các câu trong bài hát)
        /// </summary>
        public List<Sentence> Lyrics;

        /// <summary>
        /// Uri Nhạc beat
        /// </summary>
        public Uri BeatMusicUri { get; set; }

        /// <summary>
        /// Dữ liệu bài hát
        /// </summary>
        public Object  InputStream { get; set; }


        /// <summary>
        /// Chỉ số của câu đang hoặc sẽ được hát gần nhất
        /// </summary>
        public int SentenceIndicator { get; set; }


        /// <summary>
        /// Bài hát đã kết thúc hay chưa
        /// </summary>
        public bool Finish { get; set; }


        /// <summary>
        /// Chứa thông tin của bài hát: mã số, tiêu đề, tác giả, ca sĩ, (lời nhạc)
        /// </summary>
        public SongInfo Information { get; set; }

        /// <summary>
        /// Khởi tạo bài hát với dữ liệu:
        ///     Lyrics lấy từ trong file có đường dẫn LyricFileName
        ///     Nhạc beat lấy từ file có đường dẫn BeatFileName
        /// </summary>
        /// <param name="LyricFileName">Đường dẫn đến file lời nhạc</param>
        /// <param name="BeatFileName">String chứa đường dẫn đến file beat</param>

        //public Song(string LyricFileName, string BeatFileName)
        //{
        //    BeatMusicUri = new Uri(BeatFileName);
        //}



        public SongController()
        {
            SentenceIndicator = 0;
            Finish = false;
            Information = new SongInfo();
        }

        public Sentence GetSentenceByTime(TimeSpan time)
        {
            if (SentenceIndicator < Lyrics.Count)
            {
                while ((SentenceIndicator < Lyrics.Count) && (time.Subtract(Lyrics[SentenceIndicator].TimeToStart) > Lyrics[SentenceIndicator].Duration))
                {
                    SentenceIndicator++;
                }

                if (SentenceIndicator == 0)
                {
                    if (time.Subtract(Lyrics[SentenceIndicator].TimeToStart).Ticks < -150)
                        return null;
                }

                if (SentenceIndicator < Lyrics.Count) // Vẫn còn câu hát tiếp theo
                {
                    return Lyrics[SentenceIndicator];
                }
            }

            return null;// Không còn câu hát nào tương ứng với thời gian này
        }


        public void Update(TimeSpan time)
        {
            while ((SentenceIndicator < Lyrics.Count) && (time.Subtract(Lyrics[SentenceIndicator].TimeToStart) > Lyrics[SentenceIndicator].Duration))
            {
                SentenceIndicator++;
            }

            if (SentenceIndicator >= Lyrics.Count) // Vẫn còn câu hát tiếp theo
            {
                Finish = true;
            }
        }


        public Sentence GetNextSentenceByTime(TimeSpan time)
        {
            if (SentenceIndicator < Lyrics.Count - 1)
                return Lyrics[SentenceIndicator + 1];
            else
                return null;
        }

        public Sentence GoToNextSentence()
        {
            if (SentenceIndicator < Lyrics.Count - 1)
            {
                SentenceIndicator++;
                return Lyrics[SentenceIndicator];
            }
            else
            {
                SentenceIndicator = 0;
                return null;
            }
        }

        virtual public void LoadInputStream(){}

        virtual public void Close()
        { 
            
        }
    }
}
